<?php
namespace action\admin;
use \cass\formulaire AS form;

class forumsAction extends \cass\Action {

    /**
     * Méthode par défaut
     */
    public function init() {
        $this->forwardEven($this->getSession()->hasCredential('admin_forum'), '@403');

        // Infos de la page
        $this->addToAriane('class', 'news'); // Pas de fil d'ariane sur l'admin, mais on y stocke la classe du titre
    }

    /**
     * Méthode de gestion des accès
     */
    public function execute() {
        // Infos de la page
        $this->setTitle('Gestion des forums');

        // Catégories
        $categories = $this->doctrine->getRepository('ForumsCategory')->findAll();

        $this->categories = $categories;
    }

    /**
     * Créé une catégorie
     */
    public function executeCreateCategory() {
        // Infos de la page
        $this->setTitle('Création d\'une catégorie');

        // Formulaire de création de groupe
        $formulaire = new form\Formulaire('Création d\'une catégorie');
        $formulaire->setButtons('submit', 'Ajouter la catégorie');
        $formulaire->addToLinks('Retour à la gestion des forums', url_for('admin', 'forums'));
        $formulaire->append(new form\Input('Titre', '', true, ''));

        // Vérifications
        if ($formulaire->isPosted()) {
            
        }

        // Enregistrements
        if ($formulaire->isPostedWithoutError()) {
            // Récupère le max position
            $max = $this->doctrine->createQuery('SELECT max(c.pos) FROM ForumsCategory c')->getSingleScalarResult();

            $category = new \ForumsCategory;
            $category->setTitle($formulaire->getValue('Titre'));
            $category->setPos($max + 1);
            $this->doctrine->persist($category);
            $this->doctrine->flush();
            $formulaire->setConfirm('La catégorie a été ajoutée. Retournez à <a href="' . url_for('admin', 'forums') . '">la gestion des forums</a>.');
        }

        // Assignations
        $this->formulaire = $formulaire;
    }

    /**
     * Créé un forum dans une catégorie
     */
    public function executeCreateForum($_category) {
        // Infos de la page
        $this->setTitle('Création d\'un forum');

        // Catégories
        $category = $this->doctrine->find('ForumsCategory', $_category);

        $categories = $this->doctrine->getRepository('ForumsCategory')->findAll();
        $c = new form\Select('Catégorie');
        $c->setPossibleValues(array_object_to_values($categories, 'id', 'title'));
        $c->setValue(array($category->getId()));

        // Groupes
        $groups = $this->doctrine->getRepository('Group')->findAll();

        $gr = new form\Multi('Groupes', null, false);
        $gr->setPossibleValues(array_object_to_values($groups, 'id', 'name'));

        // Formulaire de création de groupe
        $formulaire = new form\Formulaire('Création d\'un forum');
        $formulaire->setButtons('submit', 'Ajouter le forum');
        $formulaire->addToLinks('Retour à la gestion des forums', url_for('admin', 'forums'));
        $formulaire->append(new form\Input('Titre', '', true));
        $formulaire->append($c);
        $formulaire->append(new form\Checkbox('Nécessite d\'être connecté', null, false));
        $formulaire->append($gr);
        $formulaire->append(new form\InputImage('Image', '', false));
        $formulaire->append(new form\Editor('Description'));

        // Vérifications
        if ($formulaire->isPosted()) {
            $groups = $formulaire->getValue('Groupes');
            if ( !empty($groups) ) {
                $formulaire->{'Nécessite d\'être connecté'}->setValue(true);
            }
        }

        // Enregistrements
        if ($formulaire->isPostedWithoutError()) {
            // Récupère le max position
            $max = $this->doctrine->createQuery('SELECT MAX(f.pos) FROM Forum f JOIN f.category c WHERE c.id = :category')->setParameter('category', $_category)->getSingleScalarResult();
            
            $forum = new \Forum;
            $forum->setTitle($formulaire->getValue('Titre'));
            $forum->setCategory($this->doctrine->find('ForumsCategory', $formulaire->getValue('Catégorie')));
            $forum->setDescription($formulaire->getValue('Description'));

             // Image
	    if ($formulaire->{'Image'}->isProperties()) {
		$path = $formulaire->{'Image'}->upload(\cass\Data::directories('upload_images'));		
		$forum->setImage($path);
	    }

            $forum->setAccess($formulaire->getValue('Nécessite d\'être connecté'));
            
            foreach ($formulaire->getValue('Groupes') AS $group) {
                $forum->addGroups($this->doctrine->find('Group', $group));
            }

            $forum->setPos($max + 1);
            $this->doctrine->persist($forum);
            $this->doctrine->flush();
            $formulaire->setConfirm('Le forum a été ajouté. Retournez à <a href="' . url_for('admin', 'forums') . '">la gestion des forums</a>.');
        }

        // Assignations
        $this->formulaire = $formulaire;
    }

    /**
     * Modifie une catégorie
     * @param <integer> $_category Id de la catégorie à modifier
     */
    public function executeEditCategory($_category) {
        // Infos de la page
        $this->setTitle('Modification d\'une catégorie');

        // Catégorie
        $category = $this->doctrine->find('ForumsCategory', $_category);

        // Formulaire de création de groupe
        $formulaire = new form\Formulaire('Modification d\'une catégorie');
        $formulaire->setButtons('submit', 'Modifier la catégorie');
        $formulaire->addToLinks('Retour à la gestion des forums', url_for('admin', 'forums'));
        $formulaire->append(new form\Input('Titre', $category->getTitle(), true, ''));

        // Vérifications
        if ($formulaire->isPosted()) {}

        // Enregistrements
        if ($formulaire->isPostedWithoutError()) {
            $category->setTitle($formulaire->getValue('Titre'));
            $this->doctrine->persist($category);
            $this->doctrine->flush();
            $formulaire->setConfirm('La catégorie a été modifiée. Retournez à <a href="' . url_for('admin', 'forums') . '">la gestion des forums</a>.');
        }

        // Assignations
        $this->formulaire = $formulaire;
    }

    /**
     * Créé un forum dans une catégorie
     */
    public function executeEditForum($_forum) {
        // Infos de la page
        $this->setTitle('Modification d\'un forum');

        // Catégories
        $forum = $this->doctrine->find('Forum', $_forum);

        $categories = $this->doctrine->getRepository('ForumsCategory')->findAll();
        $c = new form\Select('Catégorie', $forum->getCategory()->getId());
        $c->setPossibleValues(array_object_to_values($categories, 'id', 'title'));

        // Groupes
        $groups = $this->doctrine->getRepository('Group')->findAll();

        $gr = new form\Multi('Groupes', array_keys(array_object_to_values($forum->getGroups(), 'id', 'name')), false);
        $gr->setPossibleValues(array_object_to_values($groups, 'id', 'name'));

        // Formulaire de création de groupe
        $formulaire = new form\Formulaire('Modification d\'un forum');
        $formulaire->setButtons('submit', 'Modifier le forum');
        if ( $forum->getImage() != '' ) $formulaire->addToLinks('Supprimer l\'image', url_for('admin', 'forums', 'delete-image', $_forum));
        $formulaire->addToLinks('Retour à la gestion des forums', url_for('admin', 'forums'));
        $formulaire->append(new form\Input('Titre', $forum->getTitle(), true));
        $formulaire->append($c);
        $formulaire->append(new form\Checkbox('Nécessite d\'être connecté', $forum->getAccess(), false));
        $formulaire->append($gr);
        $formulaire->append(new form\InputImage('Image', $forum->getImage(), false));
        $formulaire->append(new form\Editor('Description', $forum->getDescription()));

        // Vérifications
        if ($formulaire->isPosted()) {
            $groups = $formulaire->getValue('Groupes');
            if ( !empty($groups) ) {
                $formulaire->{'Nécessite d\'être connecté'}->setValue(true);
            }
        }

        // Enregistrements
        if ($formulaire->isPostedWithoutError()) {
            $forum->setTitle($formulaire->getValue('Titre'));
            $forum->setCategory($this->doctrine->find('ForumsCategory', $formulaire->getValue('Catégorie')));
            $forum->setDescription($formulaire->getValue('Description'));

             // Image
	    if ($formulaire->{'Image'}->isProperties()) {
		$path = $formulaire->{'Image'}->upload(\cass\Data::directories('upload_images'));
                if (($forum->getImage() != null ) AND file_exists(__PATH__ . $forum->getImage())) {
		    unlink(__PATH__ . $forum->getImage());
		}
		$forum->setImage($path);
	    }

            $forum->setAccess($formulaire->getValue('Nécessite d\'être connecté'));

            $forum->getGroups()->clear();
            foreach ($formulaire->getValue('Groupes') AS $group) {
                $forum->addGroups($this->doctrine->find('Group', $group));
            }

            $this->doctrine->persist($forum);
            $this->doctrine->flush();
            $formulaire->setConfirm('Le forum a été modifié. Retournez à <a href="' . url_for('admin', 'forums') . '">la gestion des forums</a>.');
        }

        // Assignations
        $this->formulaire = $formulaire;
    }

    /**
     * Supprime une catégorie
     * @param <integer> $_category Id de la catégorie à supprimer
     */
    public function executeDeleteCategory($_category) {
        // Infos de la page
        $this->setTitle('Suppression d\'une catégorie');

        // Sélection du profil de l'utilisateur
        $category = $this->doctrine->find('ForumsCategory', $_category);

            $isForums = ( !$category->getForums()->isEmpty() ) ?
                    '<br /><strong>ATTENTION ! Cette catégorie possède des forums. Nous vous conseillons de les déplacer afin de ne pas les perdre.</strong>' :
                    '';

        // Formulaire de confirmation de suppression
        $formulaire = new form\Formulaire('Suppression d\'une catégorie');
        $formulaire->setButtons('submit', 'Supprimer la catégorie');
        $formulaire->addToLinks('Retour à la gestion des forums', url_for('admin', 'forums'));
        $formulaire->append(new form\Text('Confirmez vous la suppression de la catégorie ' . $category->getTitle() . ' ? ' . $isForums));


        // Vérifications
        if ($formulaire->isPosted()) {}

        // Enregistrements
        if ($formulaire->isPostedWithoutError()) {
            $this->doctrine->remove($category);
            $this->doctrine->flush();
            $formulaire->setConfirm('La catégorie a été supprimée. Retournez à <a href="' . url_for('admin', 'forums') . '">la gestion des forums</a>.');
        }

        // Assignations
        $this->formulaire = $formulaire;
    }

    /**
     * Supprime un forum
     * @param Integer $_forum Id du forum à supprimer
     */
    public function executeDeleteForum($_forum) {
        // Infos de la page
        $this->setTitle('Suppression d\'un forum');

        // Sélection du profil de l'utilisateur
        $forum = $this->doctrine->find('Forum', $_forum);

           
        // Formulaire de confirmation de suppression
        $formulaire = new form\Formulaire('Suppression d\'un forum');
        $formulaire->setButtons('submit', 'Supprimer le forum');
        $formulaire->addToLinks('Retour à la gestion des forums', url_for('admin', 'forums'));
        $formulaire->append(new form\Text('Confirmez vous la suppression du forum ' . $forum->getTitle() . ' ? <br /><strong>ATTENTION ! Tous ses sujets et messages seront perdus.</strong>'));


        // Vérifications
        if ($formulaire->isPosted()) {}

        // Enregistrements
        if ($formulaire->isPostedWithoutError()) {
            $this->doctrine->remove($forum);
            $this->doctrine->flush();
            $formulaire->setConfirm('Le forum a été supprimé. Retournez à <a href="' . url_for('admin', 'forums') . '">la gestion des forums</a>.');
        }

        // Assignations
        $this->formulaire = $formulaire;
    }

    /**
     * Supprime l'image d'un forum
     * @param Integer $_forum Id du forum
     */
    public function executeDeleteImage($_forum) {
        // Sélection l'utilisateur et son avatar
        $forum = $this->doctrine->find('Forum', $_forum);
        $image = $forum->getImage();

        // Supprime si l'avatar existe
        if (!empty($image) AND file_exists(__PATH__ . $image)) {
            unlink(__PATH__ . $image);
            $forum->setImage(null);
            $this->doctrine->flush();
        }

        // Redirige vers la modification de cet utilisateur
        $this->redirect('admin', 'forums', 'edit-forum', array($_forum));
    }

}